package controller

import (
	"a-common/myerr"
	"a-system/domain/entity"
	"a-system/service"
	"sync"

	"github.com/gofiber/fiber/v2"
)

var (
	sysDeptControllerTemp *SysDeptController
	sysDeptService        = service.NewSysDeptService()
	sysDeptControllerOnce sync.Once
)

type SysDeptController struct{}

func NewSysDeptController() *SysDeptController {
	sysDeptControllerOnce.Do(func() {
		sysDeptControllerTemp = &SysDeptController{}
	})
	return sysDeptControllerTemp
}

// ExcludeChild 查（排除节点）
func (m *SysDeptController) ExcludeChild(c *fiber.Ctx) error {
	vPage, err := sysDeptService.List(&entity.SysDeptDto{})
	if err != nil {
		return err
	}
	return Resp(c, vPage.Rows)
}

// List 列表
func (m *SysDeptController) List(c *fiber.Ctx) error {
	var args entity.SysDeptDto
	if err := c.QueryParser(&args); err != nil {
		return myerr.ERR_SYS_ARGS
	}
	err := args.Validator()
	if err != nil {
		return myerr.ERR_SYS_ARGS
	}

	vPage, err := sysDeptService.List(&args)
	if err != nil {
		return err
	}

	return Resp(c, vPage.Rows)
}

// Get 查
func (m *SysDeptController) Get(c *fiber.Ctx) error {
	id := c.Params("id")
	if id == "" {
		return myerr.ERR_SYS_ARGS
	}
	data, err := sysDeptService.Get(id)
	if err != nil {
		return err
	}
	return Resp(c, data)
}

// Del 删
func (m *SysDeptController) Del(c *fiber.Ctx) error {
	ids := c.Params("ids")
	if ids == "" {
		return myerr.ERR_SYS_ARGS
	}
	_, err := sysDeptService.Del(ids)
	if err != nil {
		return err
	}
	return Ok(c)
}

// Add 增
func (m *SysDeptController) Add(c *fiber.Ctx) error {
	var args entity.SysDeptDto
	if err := c.BodyParser(&args); err != nil {
		return myerr.ERR_SYS_ARGS
	}
	user := GetUser(c)
	args.CreatedBy = user.Account
	args.UpdatedBy = user.Account

	_, err := sysDeptService.Add(&args)
	if err != nil {
		return err
	}
	return Ok(c)
}

// Edit 改
func (m *SysDeptController) Edit(c *fiber.Ctx) error {
	var args entity.SysDeptDto
	if err := c.BodyParser(&args); err != nil {
		return myerr.ERR_SYS_ARGS
	}
	user := GetUser(c)
	args.UpdatedBy = user.Account

	_, err := sysDeptService.Edit(&args)
	if err != nil {
		return err
	}
	return Ok(c)
}

func (m *SysDeptController) GetTree(c *fiber.Ctx) error {
	// info, err := sysDeptService.GetTree()
	// if err != nil {
	// 	return err
	// }
	return Ok(c)
}

func (m *SysDeptController) GetTreeSelect(c *fiber.Ctx) error {
	// ids := c.Query("ids")
	// arr := strings.Split(ids, `,`)

	// // 获取权限所拥有的部门列表id
	// checkedKeys, err := roleDao.GetDeptIdsByRoleIds(arr)
	// if err != nil {
	// 	return err
	// }

	// // 获取菜单列表
	// deptTree, err := sysDeptService.GetTree()
	// if err != nil {
	// 	return err
	// }

	// return res.OkRes(c, fiber.Map{
	// 	"checkedKeys": checkedKeys,
	// 	"deptTree":    deptTree,
	// })
	return fiber.ErrInternalServerError
}
